/**
 * 
 */
package neptune.manager.builder;

import java.util.ArrayList;

import neptune.manager.model.topology.IPAddress;
import neptune.manager.utils.IllegalValueException;

/**
 * Rappresenta un insieme di range di IP Address
 * 
 * @author Roberto Bifulco [RobertoBifulco.it] [info@robertoBifulco.it]
 * 
 */
public class IPAddressRange {

	private ArrayList<IPAddress[]> ranges = new ArrayList<IPAddress[]>(0);

	/**
	 * Restituisce true se l'indirizzo passato come argomento e' contenuto in
	 * uno dei range appartenente a questo IPAddressRange.
	 * 
	 * @param address
	 * @return
	 * @throws IllegalValueException
	 */
	public boolean isInRange(IPAddress address) throws IllegalValueException {

		for (IPAddress[] range : ranges) {
			IPAddress lower = range[0];
			IPAddress upper = range[1];

			// Se e' compreso in questo range
			if (lower.compareTo(address) <= 0 && upper.compareTo(address) >= 0)
				return true;
		}

		return false;
	}

	/**
	 * Aggiunge un range di indirizzi a questo oggetto.
	 * 
	 * @param lower
	 * @param upper
	 */
	public void addRange(IPAddress lower, IPAddress upper) {
		ranges.add(new IPAddress[] { lower, upper });
	}

	/**
	 * Ottiene, per ogni range appartenente a questo oggetto, l'indirizzo piu'
	 * basso del range.
	 * 
	 * @return
	 */
	public IPAddress[] getRangeLowers() {
		IPAddress[] addrs = new IPAddress[ranges.size()];
		int i = 0;
		for (IPAddress[] range : ranges) {
			addrs[i] = new IPAddress(range[0]);
			i++;
		}
		return addrs;
	}

	/**
	 * Restiutisce un array di array di indirizzi IP. Per ogni i-esimo elemento
	 * si ha: <br>
	 * <br>
	 * [i][0] = lower ip <br>
	 * [i][1] = upper ip
	 * 
	 * @return
	 */
	public IPAddress[][] getRanges() {
		return ranges.toArray(new IPAddress[][] {});
	}

}
